import 'dart:math';

/**
 * 泛型方法：解决类、接口、方法的复用性和对不特定数据类型的支持（类型校验）
 */
T getData<T>(T value) {
  return value;
}

/**
 * 泛型类：List
 */
class PrintClass<T> {
  List list = new List<T>();

  void add(T value) {
    this.list.add(value);
  }

  void printInfo() {
    for (int i = 0; i < list.length; i++) {
      print(list[i]);
    }
  }
}

/**
 * Dart中的泛型接口：
 * 实现数据缓存的功能：有文件缓存和内存缓存。内存缓存和文件缓存按照接口定义的约束实现。
 * 1、定义一个泛型接口，约束实现它的子类必须有getByKey(key)和setByKey(key, value)
 * 2、要求setByKey时，value的类型和实例化子类时指定的类型一致
 */
abstract class Cache<T> {
  getByKey(String key, T value);

  void setByValue(String key, T value);
}

main() {
//  print(getData(21));
//  print(getData("111"));

  PrintClass printClass1 = new PrintClass<String>();
  printClass1.add("321321");
  printClass1.printInfo();

  PrintClass printClass2 = new PrintClass<int>();
  printClass2.add(321321);
  printClass2.printInfo();
}
